package com.jame.basics.reflect;

import org.junit.Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**反射
 * @author : Jame
 * @date : 2021-01-06 17:28
 **/
public class Myreflect {

    /**
     * 获取Class类
     * 1. 通过类全限定名获取
     * 2. 通过对象获取
     * 3. 直接获取对应类
     * @throws Exception
     */
    @Test
    public void test1() throws Exception {
        //通过全限定名
        Class<MyDog> Dog = (Class<MyDog>) Class.forName("com.jame.basics.reflect.MyDog");

        //通过对象获取
        MyDog myDog = new MyDog();
        Class<? extends MyDog> myDogClass = myDog.getClass();

        //直接类.class获取
        Class<MyDog> myDogClass1 = MyDog.class;

    }

    /**
     * 获取Class属性
     */
    @Test
    public void test2() throws NoSuchFieldException, NoSuchMethodException {
        MyDog dog = new MyDog();
        Class<? extends MyDog> dogClass = dog.getClass();
        //获取包名.类名
        String name = dogClass.getName();
        //直接获取包名
        String simpleName = dogClass.getSimpleName();
        //获取类中所有定义的属性和属性值
        Field[] declaredFields = dogClass.getDeclaredFields();
        //根据属性名称直接获取属性
        Field classDeclaredField = dogClass.getDeclaredField("name");
        //获取加载这个类的加载器
        ClassLoader classLoader = dogClass.getClassLoader();
        //获取所有方法
        Method[] methods = dogClass.getMethods();
        //获取具体的方法,传入方法名称和参数类型,如果没有参数则传入null
        dogClass.getMethod("getName",null);
        //....还有获取注解,获取构造.....
    }

}
